#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-11-21 19:07
# @Author : youngchaolin

import re
# 分组命名 (?P<名字>正则表达式)，通过名字取值
str='123abc45123abc45123abc45'
ret=re.search('\d(\d)\d(?P<name>\w+?)(\d)(\w)\d(\d)\d(\w+?)(\d)(\w)\d(\d)\d(\w+?)(\d)(\w)',str)
# 如果想取某个分组内容，靠数位置显然不好，可以通过对分组取名字来解决
print(ret.group(2))
# 如果用分组名字，可以做到一目了然
print(ret.group('name'))

# 分组命名的应用-标签名两边需一致
print('---分组命名的应用---')
exp='<abc>messironaldherry</abc>ognogog</bbc>'
ret=re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',exp)
print(ret.group())
# 也可以这么写,\1代表第一个分组的内容abc
ret=re.search(r'<(\w+)>.*?</\1>',exp)
print('\1')
print(ret.group())

# 如果想匹配//n这样的字符串，正常这么写
str=r'\\n'
print(str)
ret=re.search('\\\\n',str)
print(ret)

# 加一个r，代表的意义就是\\n，取消在python中特殊的意义
ret=re.search(r'\\n',str)
print(ret)

# 获取到所有的整数
ret=re.findall('\d+\.\d+|(\d+)','1-2*(60+(-40.25/5)-(-3/5))')
print(ret)

# 上面结果列表中有空字符，如果要继续去掉空字符呢？
# ret.remove('')
# print(ret)

# 使用内置函数filter解决
ret=filter(lambda n:n,ret) # lambda表达式中返回值n为空时，lambda返回的就是空，filter过滤后就不返回值
print(list(ret))

'''
有时候我们要匹配的内容是包含有不想要内容的，我们可以先匹配到结果，然后从结果里想办法
去掉不想要的内容
'''